package com.sprouting.ops.service;


import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sprouting.ops.dao.DromaraFileStorageDao;
import com.sprouting.ops.dao.OpsDeployToolDao;
import com.sprouting.ops.dao.OpsToolDao;
import com.sprouting.ops.interfaces.ConstantBase;
import com.sprouting.ops.model.DromaraFileStorage;
import com.sprouting.ops.model.OpsDeployTool;
import com.sprouting.ops.model.OpsProductDepend;
import com.sprouting.ops.model.OpsTool;
import com.sprouting.ops.model.qo.OpsToolQo;
import com.sprouting.ops.model.vo.OpsToolVo;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * 工具;(OpsTool)(OPS_TOOL) 表服务实现类
 *
 * @author ：lx（长沙麓谷）
 * @date 创建时间：2025-07-22 14:33:37
 */
@Service
@Slf4j
public class OpsToolService extends ServiceImpl<OpsToolDao, OpsTool> {

    @Resource
    private OpsToolDao opsToolDao;
    @Resource
    private DromaraFileStorageDao dromaraFileStorageDao;
    @Resource
    private OpsDeployToolDao opsDeployToolDao;

    /**
     * 分页查询 工具;
     * @param page 分页参数
     * @param query 查询参数
     * @return
     */
    public Page<OpsToolVo> getListPage(Page page, OpsToolQo query){
        return opsToolDao.getListPage(page, query);
    }

    /**
     * 保存工具
     * @param bo 工具
     * @param unifiedFileInfo 工具图标
     * @param installList 工具安装文档图片
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveOpsTool(OpsTool bo, DromaraFileStorage unifiedFileInfo, List<DromaraFileStorage> installList) {
        opsToolDao.insert(bo);

        // 图标
        if (unifiedFileInfo != null){
            dromaraFileStorageDao.updateById(unifiedFileInfo);
        }
        // 文档图片
        if (CollUtil.isNotEmpty(installList)){
            for (DromaraFileStorage dromaraFileStorage : installList) {
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
    }

    /**
     * 更新工具
     * @param bo 工具
     * @param uploadFileArray 工具图标
     * @param installList 工具安装文档图片
     */
    @Transactional(rollbackFor = Exception.class)
    public void updOpsTool(OpsTool bo, DromaraFileStorage[] uploadFileArray, List<DromaraFileStorage> installList) {
        opsToolDao.updateById(bo);

        // 图标
        if (uploadFileArray[0] != null){
            // 新的
            dromaraFileStorageDao.updateById(uploadFileArray[0]);
        }
        if (uploadFileArray[1] != null){
            // 旧的文件
            dromaraFileStorageDao.updateById(uploadFileArray[1]);
        }

        // Markdown的图片信息
        if (CollUtil.isNotEmpty(installList)){
            for (DromaraFileStorage dromaraFileStorage : installList) {
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }
    }

    /**
     * 删除工具
     * @param tool 工具
     * @param opsUploadFile 图标
     * @param installList Markdown的图片信息
     */
    @Transactional(rollbackFor = Exception.class)
    public void delOpsTool(OpsTool tool, DromaraFileStorage opsUploadFile, List<DromaraFileStorage> installList) {
        opsToolDao.deleteById(tool);

        // 删除图标
        if (opsUploadFile != null){
            dromaraFileStorageDao.updateById(opsUploadFile);
        }

        // 图片
        if (CollUtil.isNotEmpty(installList)){
            for (DromaraFileStorage dromaraFileStorage : installList) {
                dromaraFileStorage.setTempFile(ConstantBase.TempFile.PRODUCTION_DEL);
                dromaraFileStorage.setDelTime(new Date());
                dromaraFileStorageDao.updateById(dromaraFileStorage);
            }
        }

        // 绑定关系
        LambdaUpdateWrapper<OpsDeployTool> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(OpsDeployTool::getToolId, tool.getId());
        opsDeployToolDao.delete(wrapper);
    }
}
